package pe.gob.sunarp.publicidad.servicio;

import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import pe.gob.sunarp.entidad.Certificado;
import pe.gob.sunarp.entidad.TaTituActo;
import pe.gob.sunarp.entidad.TpHojaPre;
import pe.gob.sunarp.entidad.TtBloqPartida;
import pe.gob.sunarp.entidad.TtPersJuriTitu;
import pe.gob.sunarp.entidad.TtPersNatuTitu;
import pe.gob.sunarp.extranet.publicidadSimple.estadoTitulo.SolicitudEstadoBean;
import pe.gob.sunarp.publicidad.repositorio.HibernateTituloRepositorio;
import pe.gob.sunarp.publicidad.repositorio.SolicitudRepositorio;
import pe.gob.sunarp.servicioPresentacionLinea.reservaDominio.DenominacionBean;
import pe.gob.sunarp.servicioPresentacionLinea.reservaDominio.GeneralBean;
import pe.gob.sunarp.servicioPresentacionLinea.reservaDominio.JuridicaBean;
import pe.gob.sunarp.servicioPresentacionLinea.reservaDominio.MensajeMailBean;
import pe.gob.sunarp.servicioPresentacionLinea.reservaDominio.OficinaBean;
import pe.gob.sunarp.servicioPresentacionLinea.reservaDominio.ParticipanteBean;
import pe.gob.sunarp.servicioPresentacionLinea.reservaDominio.PresentanteBean;
import pe.gob.sunarp.servicioPresentacionLinea.reservaDominio.TituloBean;

@Service("solicitudServicio")
@Transactional
public class SolicitudServicioImpl implements SolicitudServicio {
	private static Logger log = Logger.getLogger(HibernateTituloRepositorio.class.getName());

	private SolicitudRepositorio solicitudRepositorio;

	@Autowired
	public void setSolicitudRepositorio(SolicitudRepositorio solicitudRepositorio) {
		this.solicitudRepositorio = solicitudRepositorio;
	}

	public SolicitudRepositorio getSolicitudRepositorio() {
		return solicitudRepositorio;
	}

	@Override
	public List<OficinaBean> listOficRegistral() {

		List<OficinaBean> list = solicitudRepositorio.listOficRegistral();
		return list;
	}

	@Override
	public List<MensajeMailBean> findMensajeMail(String anoHoja, String numHoja, String coOficReg, String coRegPub) {

		List<MensajeMailBean> listaBean = solicitudRepositorio.findMensajeMail(anoHoja, numHoja, coOficReg, coRegPub);
		return listaBean;
	}

	@Override
	public GeneralBean buscarReservaDominio(String anioHoja, String numHoja, String coOfiPres, String coRegPres) {

		/*
		 * String numHoja = "V0000007";
		 * 
		 * // String numHoja = "V0000577"; String anoHoja = "2009"; String
		 * coOficReg = "01"; String coRegPub = "01";
		 */

		// BEAN GENERAL EN EL CUAL SE ENCAPSULA TODA LA DATA
		GeneralBean bg = new GeneralBean();
		PresentanteBean pre = new PresentanteBean();
		JuridicaBean jur = new JuridicaBean();
		log.trace("ingreso aqui");
		bg.setIndSeleccion("01");
		bg.setDesSeleccion("CONSTITUCION");

		// List<GeneralBean> listAll = new ArrayList<GeneralBean>();

		bg.setNumHoja(numHoja);
		bg.setAnioHoja(anioHoja);
		bg.setCoOfiPres(coOfiPres);
		bg.setCoRegPres(coRegPres);
		// PARA CONTROLAR LOS MENSAJES DE VALIDACIONES
		bg.setFlag("OK");

		boolean var;

		String refNumTitu = null;
		try {
			List<MensajeMailBean> listMensajeMail = findMensajeMail(anioHoja, numHoja, bg.getCoOfiPres(),
					bg.getCoRegPres());
			refNumTitu = listMensajeMail.get(0).getRefnumTitu();
			var = true;
		} catch (Exception ex) {
			var = false;
			log.trace("ENTOR EN EL CATCH");
		}

		if (var) {
			bg.setRefNumTitu(Long.valueOf(refNumTitu));

			List<TituloBean> listTitulo = solicitudRepositorio.findTituloMM(Long.valueOf(refNumTitu));

			for (TituloBean tituloBean : listTitulo) {
				bg.setNumTitu(tituloBean.getNunTitu());
				bg.setAnioTitu(tituloBean.getAnoTitu());
				bg.setTsPrest(tituloBean.getTsPresent());
			}

		} else {
			bg.setNumTitu("NO ENCONTRADO");
			bg.setAnioTitu("");
			bg.setTsPrest(null);

		}
		log.trace("llego aquei");
		log.trace(bg.getAnioHoja());
		log.trace(bg.getNumHoja());
		log.trace(bg.getCoOfiPres());
		log.trace(bg.getCoRegPres());

		// VALIDADO SI TIENE DATOS ...

		log.trace("inicio en findhojapres");
		List<TpHojaPre> listHojaPres = solicitudRepositorio.findHojaPres(bg.getAnioHoja(), bg.getNumHoja(),
				bg.getCoOfiPres(), bg.getCoRegPres());

		if (listHojaPres.isEmpty()) {

			log.trace("LLEGA VACIO");
		} else {
			log.trace("llega llemo" + listHojaPres.size());

		}

		log.trace("fializo el find hoja pre");

		if (listHojaPres.size() > 0) {
			int cont = 0;
			for (TpHojaPre beanHojaPres : listHojaPres) {
				cont++;

				log.trace("mensaje del contador" + cont);

				bg.setServicio(beanHojaPres.getServicioId());
				bg.setDesServicio(beanHojaPres.getDeServicio());
				bg.setCodArea(beanHojaPres.getCoArea());
				bg.setCodUsuario(beanHojaPres.getIdUsuario());

				pre.setApePaterno(beanHojaPres.getApPatePres());
				pre.setApeMaterno(beanHojaPres.getApMatePres());
				pre.setNombre(beanHojaPres.getNoPres());
				pre.setNumDocu(beanHojaPres.getNuDocu());
				pre.setTipoDocu(beanHojaPres.getTiDocuIden());
				pre.setDescDocu(beanHojaPres.getDeTiDocuIden());
				pre.setDireccion(beanHojaPres.getNoViaPres());
				pre.setEmail(beanHojaPres.getMailPres());
				// fix
				log.trace(">>>>>>>>>>>>>>>>>>>1");

				String siHojaPres = beanHojaPres.getTiSituHojaPres();

				// boolean
				// a=StringUtils.isEmpty();

				log.trace("EL VALOR DEL TISUHOJAPRES:" + beanHojaPres.getTiSituHojaPres());

				if (siHojaPres != null) {

					pre.setDescParticipacion(tipoParticipantes(beanHojaPres.getTiSituHojaPres()));
					log.trace(">>>>>>>>>>>>>>>>>>>2" + beanHojaPres.getUbGeogPres());
					log.trace(">>>>>>>>>>>>>>>>>>>3" + beanHojaPres.getTiSituHojaPres());

					String idDepa = beanHojaPres.getUbGeogPres().substring(0, 2);
					String idProv = beanHojaPres.getUbGeogPres().substring(2, 4);

					jur.setProvincia(idProv);
					jur.setDepartamento(idDepa);

					log.trace("mensjae de :" + pre.getApeMaterno());
					log.trace("id depa>>>" + idDepa);
					log.trace("id provi>>>" + idProv);

					String nomProvincia = solicitudRepositorio.findProvincia(idProv, idDepa);
					log.trace("NOMBRE DE PROVINCIA :" + nomProvincia);
					String[] arrayLocal = nomProvincia.split("-");

					jur.setDescProv(arrayLocal[0]);
					jur.setDescDepto(arrayLocal[1]);

				} else {
					bg.setFlag("ERROR1");
					log.trace("provincia y departamento estan en null");

				}

				bg.setPresentante(pre);

			}

			log.trace("TAMANO DE LISTA TTHOJAPRES:" + listHojaPres.size());
			bg.setJuridica(jur);

			// RECUPERANDO DENIMINACIONES
			List<DenominacionBean> listDenomincacion = new ArrayList<DenominacionBean>();

			List<TtPersJuriTitu> listRZ = solicitudRepositorio.findDenominaionRZ(bg.getAnioHoja(), bg.getNumHoja(),
					bg.getCoOfiPres(), bg.getCoRegPres());

			DenominacionBean bd;
			for (TtPersJuriTitu ttPersJuriTitu : listRZ) {
				bd = new DenominacionBean();
				bd.setDenominacion(ttPersJuriTitu.getRzSocl());
				bd.setAbrvDenominacion(ttPersJuriTitu.getDeSigl());
				listDenomincacion.add(bd);
			}

			bg.setListaDenomincacion(listDenomincacion);

			List<TaTituActo> listActo = solicitudRepositorio.findActoTitu(bg.getAnioHoja(), bg.getNumHoja(),
					bg.getCoOfiPres(), bg.getCoRegPres());

			for (TaTituActo taTituActo : listActo) {
				bg.setCodLibro(taTituActo.getCoLibr());
				bg.setDesLibro(taTituActo.getDeLibr());
				bg.setCodActo(taTituActo.getId().getCoActoRgst());
				bg.setDesActo(taTituActo.getDeActoRgst());
			}
			jur.setDescTipo(bg.getDesLibro());

			// PARA OTROS CAOSOS DE MODIFICACION
			List<TtPersJuriTitu> listAdoptante = solicitudRepositorio.findAdoptante(bg.getAnioHoja(), bg.getNumHoja(),
					bg.getCoOfiPres(), bg.getCoRegPres());

			// log.trace("cantidad de adoptanes:>>>>>" + listAdoptante.size());

			for (TtPersJuriTitu ttPersJuriTitu : listAdoptante) {
				jur.setPartida(ttPersJuriTitu.getNuPart());
				jur.setRazonSocial(ttPersJuriTitu.getRzSocl());
			}

			// log.trace("RAZON SOCIAL:>>>>>>>>>>>>>>>>>>>>>>" +
			// jur.getRazonSocial());

			List<TtBloqPartida> listBloqPartida = solicitudRepositorio.findBloqPartida(bg.getAnioHoja(),
					bg.getNumHoja(), bg.getCoOfiPres(), bg.getCoRegPres());

			jur.setFicha("");
			for (TtBloqPartida ttBloqPartida : listBloqPartida) {
				jur.setFicha(ttBloqPartida.getFicha());
				bg.setIndSeleccion("02");
				bg.setDesSeleccion("MODIFICACION");
			}

			List<ParticipanteBean> listParticipantes = new ArrayList<ParticipanteBean>();

			// LISTAR LOS PARTICIPANTES PN
			List<TtPersNatuTitu> listPN = solicitudRepositorio.findParticipantePN(bg.getAnioHoja(), bg.getNumHoja(),
					bg.getCoOfiPres(), bg.getCoRegPres());

			ParticipanteBean bp;
			for (TtPersNatuTitu ttPersNatuTitu : listPN) {
				bp = new ParticipanteBean();

				bp.setApePaterno(ttPersNatuTitu.getApPatePersNatu());
				bp.setApeMaterno(ttPersNatuTitu.getApMatePersNatu());
				bp.setNombre(ttPersNatuTitu.getNoPersNatu());
				bp.setNumDocu(ttPersNatuTitu.getNuDocu());
				bp.setDescDocu(ttPersNatuTitu.getTiDocuIden());
				bp.setTipoDocu("DNI");
				bp.setTipoParticipante(ttPersNatuTitu.getTiPrtc());
				bp.setDescTipoParticipante(ttPersNatuTitu.getDeTiPrtc());

				listParticipantes.add(bp);
			}

			// FIND EL PARTICIPANTE PJ

			List<TtPersJuriTitu> listParticipantesPJ = solicitudRepositorio.findParticipantePJ(bg.getAnioHoja(),
					bg.getNumHoja(), bg.getCoOfiPres(), bg.getCoRegPres());
			for (TtPersJuriTitu ttPersJuriTitu : listParticipantesPJ) {
				bp = new ParticipanteBean();

				bp.setTipoDocu("RUC");
				bp.setNumDocu(ttPersJuriTitu.getNuDocu());
				bp.setDescDocu("RUC");
				bp.setDescTipoParticipante(ttPersJuriTitu.getDeTiPrtc());
				bp.setRazonSocial(ttPersJuriTitu.getRzSocl());

				listParticipantes.add(bp);
			}

			bg.setListaParticipante(listParticipantes);
			log.trace("llega hata le fin del metodo");
		} else {

			bg.setFlag("ERROR");

		}

		log.trace("MENSAJES DE EROROR:" + bg.getFlag());
		return bg;
	}

	private String tipoParticipantes(String valor) {

		String tipo;

		switch (Integer.parseInt(valor)) {
		case 1:
			tipo = "Titular";
			break;
		case 2:
			tipo = "Socio";
			break;
		case 3:
			tipo = "Abogado";
			break;
		case 4:
			tipo = "Notario";
			break;
		case 5:
			tipo = "Representante";
			break;
		default:
			tipo = "";
			System.out.println("error al asignar tipo de presentante...");
			break;
		}

		return tipo;
	}
	
	
	//solicitudes euclides
	@Override
	public List<SolicitudEstadoBean> buscarSolicitudes(long numeroSolicitud) {		
		List<SolicitudEstadoBean> lista  = solicitudRepositorio.buscarSolicitudes(numeroSolicitud);		  
		return lista;
	}
	
	@Override
	public List<Certificado> listcertificado(long solicitud_id) {
	 List<Certificado> lista = solicitudRepositorio.listcertificado(solicitud_id);
		return lista;		
	}
	//fin de solicitudes

}
